<?php

/*
 * APC缓存类
 */
 
 class Cache_apc extends Base {
 
	protected $expiration = 3600;
	
	protected $_valid = array(
		'expiration'
	);
	
	public function __construct($config = array())
	{
		if ($config)
		{
			$this->config($config);
		}
	}
	
	/*
	 * 初始化
	 * @access	public
	 * @return	boolean
	 */
	public function init()
	{
		if ( ! function_exists('apc_add') || ! function_exists('apc_store') || ! function_exists('apc_fetch'))
		{
			$this->set_error('服务器不支持APC缓存');
			return FALSE;
		}
		return TRUE;
	}

	/*
	 * 保存
	 * @access	public
	 * @param	$id string 键名
	 * @param	$data mixed 键值数据，资源不行滴
	 * @param	$expiration integer 缓存时间
	 * @return	boolean
	 */
	public function set($id, $data, $expiration = NULL)
	{
		$expiration = ($expiration !== NULL) ? intval($expiration) : intval($this->expiration);
		$expiration = $expiration > 0 ? $expiration : 0;
		return apc_store($id, $data, $expiration);
	}

	/*
	 * 返回缓存数据
	 * @access	public
	 * @param	$id string 键名
	 * @return	mixed
	 */
	public function get($id)
	{
		$result = apc_fetch($id);
		return (is_array($result) && (count($result) == 3)) ? $result[0] : FALSE;
	}
	
	/*
	 * 返回缓存详细信息
	 * @access	public
	 * @param	$id string 键名
	 * @return	array or boolean
	 */
	public function detail($id)
	{
		$result = apc_fetch($id);
		if ( ! is_array($result) && count($result) != 3)
		{
			return FALSE;
		}
		
		list($data, $time, $expiration) = $result;
		
		//data => 缓存数据 保存时候的时间，秒 expiration => 缓存时间，秒
		return array(
			'data' => $data,
			'time' => $time,
			'expiration' => $expiration
		);
	}
	
	/*
	 * 删除
	 * @access	public
	 * @param	$id string 键名
	 * @return	boolean
	 */
	public function delete($id)
	{
		return apc_delete($id);
	}
	
	/*
	 * 清空
	 * @access	public
	 * @return	boolean
	 */
	public function clean()
	{
		return apc_clear_cache();
	}
	
	public function set_expiration($expiration)
	{
		$this->expiration = intval($expiration) > 0 ? intval($expiration) : 0;
		return $this;
	}

}